const DBVersion = "1";
const mainStore = "files";

export function openDB(dbName) {
  //返回一个 promise对象，为了实现异步传输（创建promise对象后就会立即执行）
  return new Promise((resolve, reject) => {
    //兼容浏览器
    const indexedDB =
      window.indexedDB ||
      window.mozIndexedDB ||
      window.webkitIndexedDB ||
      window.msIndexedDB;
    let db, ObjectStore;

    //打开数据库，若没有就创建
    const request = indexedDB.open(dbName, DBVersion);

    //调用数据库打开或创建成功回调函数()
    request.onsuccess = (event) => {
      //获取 数据库对象,里面有很多方法（增删改查）
      db = event.target.result;
      // console.log('数据库打开成功！');
      //返回数据库对象
      resolve(db);
    };

    //创建或打开数据库失败回调函数
    request.onerror = (event) => {
      console.error("本地储存库打开错误");
      reject(event);
    };

    //数据库更新回调函数。初次创建，后续升级数据库用
    request.onupgradeneeded = (event) => {
      // console.log('数据库更新啦');
      //获取数据库对象
      db = event.target.result;
      // 清除旧 objectStore（对旧 objectStore 的数据进行迁移，暂未）
      if (db.objectStoreNames.contains(mainStore)) {
        // console.log(db.objectStoreNames); DOMStringList 对象
        db.deleteObjectStore(mainStore);
      }
      //创建新存储库(存储库名称，对象)-创建表（users表）
      ObjectStore = db.createObjectStore(mainStore, {
        //主键,必须唯一
        KeyPath: "fileID",
        autoIncrement: true //实现自增加
      });

      //创建索引，在后面查询数据的时候可以根据索引查-创建字段（字段名，索引名，是否唯一：true）
      //可以通过索引来查询
      ObjectStore.createIndex("fileID", ["fileID"], { unique: true });
    };
  });
}

export function addData(db, storeName, data) {
  var request = db
    // 事务对象 指定表格名称和操作模式（"只读"或"读写"）
    .transaction([storeName], "readwrite")
    // 仓库对象
    .objectStore(storeName)
    .add(data);

  //成功回调函数
  request.onsuccess = function (event) {
    console.log("数据写入成功");
  };
  //失败回调函数
  request.onerror = function (event) {
    console.error("数据写入失败");
  };
}

export function getDataByKey(db, storeName, key) {
  return new Promise((resolve, reject) => {
    var transaction = db.transaction([storeName]); // 事务
    var objectStore = transaction.objectStore(storeName); // 仓库对象
    var request = objectStore.get(key); // 通过主键获取的查询数据
    //失败回调函数
    request.onerror = function (event) {
      console.log("事务失败");
    };
    //查询成功回调函数
    request.onsuccess = function (event) {
      // console.log("主键查询结果: ", request.result);
      //返回值对应的值
      resolve(request.result);
    };
  });
}

// 游标
export function getCursor(db, storeName) {
  return new Promise((resolve, reject) => {
    const transaction = db.transaction([storeName]); // 事务
    const objectStore = transaction.objectStore(storeName); // 仓库对象
    const request = objectStore.openCursor(); //游标
    //失败回调函数
    request.onerror = function (event) {
      console.log("事务失败");
    };
    //查询成功回调函数

    request.onsuccess = function (event) {
      callback(event.target.result);
    };

    const resultValue = {};
    function callback(result) {
      if (!result) {
        resolve(resultValue);
        return;
      }
      const blob = result.value;
      resultValue[result.key] = blob;
      result.continue();
    }
  });
}

export function closeDB(db) {
  return new Promise((resolve, reject) => {
    db.close();
    resolve("数据库已关闭");
  });
}
